热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

也就是|单打_.netCore自我学习随笔——工作的核心:增删改查

篇首语:本文由编程笔记#小编为大家整理,主要介绍了.netCore自我学习随笔——工作的核心:增删改查相关的知识,希望对你有一定的参考价值。上次介绍了一下如何进行连接

篇首语:本文由编程笔记#小编为大家整理,主要介绍了.net Core 自我学习随笔——工作的核心:增删改查相关的知识,希望对你有一定的参考价值。


上次介绍了一下如何进行连接数据库,我们连了一个 SQL Server 试了试,感觉还是比较良好的。

但是有人说,不会数据库操作。什么怎么怎么查询,怎么怎么插入(上次不是演示了吗?),还有怎么怎么修改,对了删除不了怎么办。什么怎么样,该怎么办就怎么办——汪。。。

一、查:
查,是我们常用的操作。比如,向用户展示相关信息,相关的数据等等。怎么操作呢?我们来一步一步进行操作。

first:我们先把 Home/IndexController 与 View/index.cshtml 里面的进行修改,代码如下:

先改 HomeController:

using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
namespace testProject.Controllers
public class HomeController : Controller

Model.myDataBase db = new Model.myDataBase();
public IActionResult Index()

var userlist = from u in db.Users
select u;
ViewBag.userList = userlist;
ViewBag.userCount = userlist.Count();
return View();


1、Model.myDataBase db = new Model.myDataBase();
不必说了,我们先准备好数据库对象,以遍进行数据库操作,所以,我把其作为类的一个属性,而不是方法里面的变量。这样可以在需要时直接调用。

2、public IActionResult Index()
这就相当于原来 .net 里的 public ActionResult Index()。在 .net core 中,全是在 ActionResult 前面加个“I”。其它的都一样啦。

3、var userlist = from u in db.Users select u;
这个就是执行 Linq 进行查询操作。

4、ViewBag.xxx 就是向视图(View)进行数据传输,也就是向前端传输显示的内容。

我们已经知道了有“public IActionResult Index()”,就要在视图(View)中建立一个对应的 index.cshtml,那我们建立一下,具体代码如下:

Views/Home/index.cshtml

@
ViewData["Title"] = "主页";
<style type&#61;"text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
style>

<table class&#61;"tableStyleBorder">
<tr>
<th>IDth>
<th>姓名th>
<th>创建时间th>
tr>
&#64;if(0 <ViewBag.userCount)

&#64;foreach (var item in ViewBag.userList)

<tr>

<td>&#64;item.idtd>
<td>&#64;item.nametd>
<td>&#64;item.createtimetd>
tr>


else

<tr>
<td colspan&#61;"3">没有数据td>
tr>

table>

1、ViewBag.xxx 就是对应“控制器”&#xff08;Controller 文件夹中的 CS 文件里&#xff09;中的 ViewBag.xxx&#xff08;见 HomeController.cs&#xff09;。执行顺便是&#xff0c;先执行 控制器&#xff0c;得到的数据通过 ViewBag 传给 index.cshtml。

2、&#64;if、&#64;foreach&#xff1a;前者判断&#xff0c;后者遍历。其实有些 .net 基础的都能看明白。如果看不明白&#xff0c;请查书——最基础的知识呀~~~

执行结果&#xff1a;

二、增&#xff1a;
增加我们已经知道了&#xff0c;只不过&#xff0c;我们做得再好一些。让数据从前端传过来。因为&#xff0c;我们为此要做一个“控制器”和一个“视图”。

HomeController 增加一个方法&#xff1a;

[HttpGet]
public IActionResult writeUser()
return View();

这里我们看到比之前的 index() 多了一个 [HttpGet]&#xff0c;这个是指定只有 Get 才能访问的意思。为什么要加这个&#xff0c;我们在后面写入数据库时&#xff0c;就能看出来了。

建立对应的视图
Views/Home/writeUser.cshtml&#xff1a;

<div style&#61;"margin-top: 30px;">
&#64;using (Html.BeginForm("writeUser", "Home", FormMethod.Post))


&#64;Html.TextBox("username")
"submit" id&#61;"btnSubmit" name&#61;"btnSubmit" />

div>

其中 Html.BeginForm 与 HTML 中的 form 标签 是一个意思&#xff0c;FormMethod.Post 就是 method&#61;”post”。而 “writeUser”, “Home”&#xff0c;就是 Home/writeUser。如果有 .net MVC 基础的一看就明白了。其实与原来的没有区别。&#64;Html.TextBox&#xff0c;就是 input name&#61;”text” 这标签。

这里完全也可以用 HTML 来写&#xff0c;也没有区别&#xff1a;

<div style&#61;"margin-top: 30px;">
<from action&#61;"/Home/writeUser" method&#61;"post">
<label>姓名&#xff1a;label>
<input type&#61;"text" id&#61;"username" name&#61;"username" />
<input type&#61;"submit" id&#61;"btnSubmit" name&#61;"btnSubmit" />
form>
div>

以上的执行效果是&#xff1a;

通过上面的代码&#xff0c;我们知道&#xff0c;在你点击提交时&#xff0c;代码会转到 Home/writeUser&#xff0c;但 writeUser 只支持 Get 方式访问&#xff0c;但这里是 post 提交数据&#xff0c;所以我们这时要在“控制器”中来个函数重载&#xff0c;代码如下&#xff1a;

[HttpPost]
public string writeUser(string username &#61; "")
string _name &#61; System.Net.WebUtility.HtmlEncode(username.Trim());
if(0 &#61;&#61; _name.Length)

return "操作失败&#xff01;";

Model.dbo.MyUser user &#61; new Model.dbo.MyUser

name &#61; _name,
createtime &#61; DateTime.Now
;
db.Users.Add(user);
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";

其中&#xff0c;这里有一个“System.Net.WebUtility.HtmlEncode”&#xff0c;他是相当于之前 MVC 中的 Server.HtmlEncode&#xff0c;对传过来的参数进行处理&#xff0c;以防止别人传来一些危险字符&#xff0c;造成数据库问题。

上面已经不是[HttpGet]&#xff0c;而是[HttpPost]&#xff0c;说明必须是 Post 方式防问。好的&#xff0c;我们执行一下看看&#xff1a;

点击提交后的执行结果&#xff1a;

三、改&#xff1a;
能查看&#xff0c;能增加&#xff0c;那么就必须能修改了。修改一般要在查的基础之上。如果不查&#xff0c;是不可能修改的&#xff0c;因为你不知道修改谁&#xff0c;怎么确定修改的对象。就像找小姐&#xff0c;你不可能找个长得比较难看的&#xff0c;一般都有一个硬性需求&#xff0c;再找。有时找一个&#xff0c;有时找两以上。找一个就男女单打&#xff0c;两个是斗地主&#xff0c;三个就是麻将。

因为&#xff0c;为了以查为基础&#xff0c;所以&#xff0c;我们要修改一下 Index 的内容——也就是加一个操作列。

<style type&#61;"text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
style>

<table class&#61;"tableStyleBorder">
<tr>
<th>IDth>
<th>姓名th>
<th>创建时间th>
<th>操作th>
tr>
&#64;if(0 <ViewBag.userCount)

&#64;foreach (var item in ViewBag.userList)

<tr>

<td>&#64;item.idtd>
<td>&#64;item.nametd>
<td>&#64;item.createtimetd>
<td><a href&#61;"/Home/updateInfo?id&#61;&#64;item.id">修改a>td>
tr>


else

<tr>
<td colspan&#61;"3">没有数据td>
tr>

table>

这里加了一个“操作”和“修改”&#xff0c;用这种方式来连接修改页面。

那么好&#xff0c;万事俱备&#xff0c;只差修改。我们现在来做修改页面&#xff0c;我们起名为“updateInfo”&#xff0c;这个名字可以从 A 标签中看出来&#xff01;^^

修改页&#xff0c;起先要先做个展示页&#xff0c;之后才是修改&#xff0c;与“增”操作相似。只不过要在原来的输入数据的页面中进行一次查询相应值&#xff0c;这是为了如果数据特别多的话&#xff0c;不可能每一个都要进行修改&#xff0c;可能只改几个的。

先看修改页面的用户界面&#xff0c;分为&#xff1a;视图&#xff08;View&#xff09;与 [HttpGet] 的控制器&#xff08;Controller&#xff09;

Views/Home/updateInfo.cshtml&#xff1a;

<div style&#61;"margin-top: 30px;">
&#64;using (Html.BeginForm("updateInfo", "Home", FormMethod.Post))


string _username &#61; ViewBag.Name;
&#64;Html.TextBox("username", _username);
"hidden" id&#61;"id" name&#61;"id" value&#61;"&#64;ViewBag.ID" />
"submit" id&#61;"btnSubmit" name&#61;"btnSubmit" />

div>

我们可以看出从控制器中传来了两个值&#xff1a;ViewBag.XXX。因为在 &#64;Html 中不能直接使用 ViewBag.Name&#xff0c;所以要用“string _username &#61; ViewBag.Name;”嘚瑟一下。

再看看 HomeController 中&#xff0c;我们又加了什么&#xff1a;

[HttpGet]
public IActionResult updateInfo(int id &#61; 0)
var user &#61; (from u in db.Users
where u.id &#61;&#61; id
select u).FirstOrDefault();
if(null &#61;&#61; user)

return RedirectToAction("Error");

ViewBag.ID &#61; id;
ViewBag.Name &#61; user.name;
return View();

这里看到视图&#xff08;View&#xff09;中的 ViewBag 的实现。再看看&#xff0c;我们发现了一个奇怪的一段&#xff1a;

if(null &#61;&#61; user)
return RedirectToAction("Error");

这一段是通过对数据库表 Users 查询后&#xff0c;通过 FirstOrDefault() 方法取到第一个值。但是&#xff0c;如果查询为空的话&#xff0c;那么取到的第一个值就是为 null&#xff0c;这里是为了防止没有数据的情况下出错。

这里稍稍介绍一下&#xff0c;如果在使用 Linq 进行查询后&#xff0c;没有用 FirstOrDefault() 的话&#xff0c;来判断是否有数据&#xff0c;而不是通过与 null 进行对比&#xff0c;而是通过 Count() 方法判断是否为 0。

而“return RedirectToAction(“Error”);”就是跳转的意思&#xff0c;跳转到同控制器下的 Error 视图&#xff08;View&#xff09;中。而这个视图&#xff0c;我们可以不用做控制器——就是显示一行字而已&#xff1a;

Views/Home/Error.cshtml&#xff1a;

<div style&#61;"text-align: center;"><h1>页面错误&#xff01;h1>div>

整个执行的页面样式就是&#xff1a;

好现在修改页面已经做好了。当我们点击提交时&#xff0c;就应该交由系统来进行修改操作了。这个&#xff0c;与“增”一样&#xff0c;完全在控制器中执行&#xff1a;

[HttpPost]
public string updateInfo(int id &#61; 0, string username &#61; "")
string _name &#61; System.Net.WebUtility.HtmlEncode(username.Trim());
var user &#61; (from u in db.Users
where u.id &#61;&#61; id
select u).FirstOrDefault();
if (null &#61;&#61; user && 0 &#61;&#61; _name.Length)

Response.Redirect(Url.Action("Error", "Home"));
return "";

user.name &#61; _name;
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";

我们执行一下。首先&#xff0c;我们在 Index 里选择找二条数据&#xff0c;并点击那一行的“修改”&#xff1a;

在进入的修改页面中&#xff0c;将 123 改成 abc&#xff0c;并点击“提交”按钮。

之后&#xff0c;系统自动执行并显示最终结果 ->Index

修改操作就这样子了。

四、删&#xff1a;
最后一项了&#xff0c;终于到了删了。删除也是必要操作&#xff0c;但是是属于危险性操作&#xff0c;因为可能整不好数据就没了。好了&#xff0c;现在我们开始准备删除操作。

准备与“改”一样&#xff0c;就是在操作那一列中再加个“删除”即可&#xff1a;

&#64;
ViewData["Title"] &#61; "主页";
<style type&#61;"text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
style>

<table class&#61;"tableStyleBorder">
<tr>
<th>IDth>
<th>姓名th>
<th>创建时间th>
<th>操作th>
tr>
&#64;if(0 <ViewBag.userCount)

&#64;foreach (var item in ViewBag.userList)

<tr>

<td>&#64;item.idtd>
<td>&#64;item.nametd>
<td>&#64;item.createtimetd>
<td>
<a href&#61;"/Home/updateInfo?id&#61;&#64;item.id">修改a>
|
<a href&#61;"/Home/delInfo?id&#61;&#64;item.id">删除a>
td>
tr>


else

<tr>
<td colspan&#61;"3">没有数据td>
tr>

table>

从上面&#xff0c;我们能看出来&#xff0c;删除是调用 delInfo。因为是删除&#xff0c;不需要显示什么&#xff0c;所以直接在“控制器”&#xff08;Controller&#xff09;中进行操作即可&#xff0c;代码如下&#xff1a;

public string delInfo(int id &#61; 0)
var user &#61; (from u in db.Users
where u.id &#61;&#61; id
select u).FirstOrDefault();
if (null &#61;&#61; user)

Response.Redirect(Url.Action("Error", "Home"));
return "";

db.Users.Attach(user);
db.Users.Remove(user);
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";

我们点击一下第二行的“删除”看看效果&#xff1a;

OK&#xff0c;增删改查全部完成。有一件需要说明一下。在批量操作时&#xff0c;“db.SaveChanges();”在方法中最好在一批次中&#xff0c;只执行一次&#xff0c;不然会出现死锁&#xff0c;比如&#xff1a;

foreach(var item in userlist)
item.name &#61; "1111";
db.SaveChanges();

千万不要把 db.SaveChanges() 写到 foreach 里。


推荐阅读
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
author-avatar
Only_cxy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有